Template Haskell
Haskellのmacro
Haskellでメタプログラミングする
コンパイル時に展開される
構文解析時に展開される
Language.Haskell.THモジュールを使う
Template HaskellのASTも参考
TemplateHaskellを使う
code:hs
{-# LANGUAGE TemplateHaskell #-}
import Language.Haskell.TH
関数
runQ
HaskellコードからHaskell ASTを生成する
code:例hs
runQ e|1+2|
code:出力
InfixE
(Just (LitE (IntegerL 1)))
(VarE GHC.Num.+)
(Just (LitE (IntegerL 2)))
ppr
Haskell ASTからHaskellコードを生成する
しかしrunQの出力をそのままとれるわけではなくGHC.Num.+などは'(GHC.Num.+)と書く必要がある
$(..)
eval
..の部分にクオート式を書く
Quoatationモナド
クォート式のQがそれ
クォート式
式クォート
[| .. |] :: Q Exp
または[e| .. |]
宣言クォート
[d| .. |] :: Q [Dec]
top-levelの宣言を書く
code:hs
d| main = putStrLn "Hello" | --> Hello
型クォート
[t| .. |] :: Q Type
パターンクォート
[p| ... |] :: Q Pat
オレオレクオート式を自作する
QuasiQuotesを使う
https://qiita.com/nwtgck/items/002817daa0e90e72870b
https://ruicc.hatenablog.jp/entry/20111015/1318630433
ユースケース
コンパイル時評価
https://qiita.com/nwtgck/items/b6d048c2730c37be0870
https://qiita.com/YoshikuniJujo/items/a8373c1bd1986ced9d5d
ちょっと特殊なケース?
https://qiita.com/myuon_myon/items/6880a2c92117c51929b0
Haskellで文字列フォーマットをやる
"{hoge}です"みたいなやつ
[format|{_1}, {_2}!|] $ ("hello", "world")
https://qiita.com/nwtgck/items/55fef4e66da1693bde83
assertのエラーメッセージに、問題の式を含める
let !x = [assert|a == "hello" && b > 9999999|]
Yesod
[parseRoutes| / HomeR GET |]
参考
Template Haskell入門 - think and error
概要
Template Haskell を使ってメタプログラミングをやってみた│FORCIA CUBE│フォルシア株式会社
https://wiki.haskell.org/Template_Haskell
最初に読むやつ
http://www.kotha.net/ghcguide_ja/latest/template-haskell.html
Template Meta-programming for Haskell pdf
論文
https://github.com/shiatsumat/wiwinwlh-jp/blob/master/mds/テンプレートハスケル.md
https://qiita.com/YoshikuniJujo/items/a837
https://jmtd.net/log/generic_haskell/
https://markkarpov.com/tutorial/th.html